import type { PageType } from '../../page_handler/type'
import type { OptionsConfig } from './gm_storage'
import { HOSTNAME, SUPPORTED_PLATFORMS } from '../../../types/constants'
import { PageHandler } from '../../page_handler'
import { GMStorage } from './gm_storage'

// 转换规则类型
type PageTypeConversionRules = Partial<Record<PageType, PageType>>

// 各平台的转换规则映射
type PlatformTypeMap = Record<string, PageTypeConversionRules>

export abstract class PageStorage extends GMStorage {
  protected useDomainIsolation = true // 域名隔离控制
  protected usePageTypeIsolation = false // 页面类型隔离控制
  private readonly defaultTypeMap: PlatformTypeMap = { // 默认转换规则
    [SUPPORTED_PLATFORMS.GREASY_FORK]: {},
  }

  /**
   * 获取存储值（带页面类型隔离）
   */
  storageGet<T>(key: string, defaultValue: T, options?: OptionsConfig): T {
    const finalOptions = this.getFinalStorageOptions(options)
    return this.storage.get(key, defaultValue, finalOptions)
  }

  /**
   * 设置存储值（带页面类型隔离）
   */
  protected storageSet<T>(key: string, value: T, options?: OptionsConfig): void {
    const finalOptions = this.getFinalStorageOptions(options)
    this.storage.set(key, value, finalOptions)
  }

  /**
   * 获取最终存储选项（子类可覆盖）
   */
  protected getFinalStorageOptions(options?: OptionsConfig): OptionsConfig {
    return {
      useNamespace: true, // 默认启用命名空间
      useDomainIsolation: this.useDomainIsolation, // 默认启用域名隔离
      scope: 'pageType',
      pageType: this.usePageTypeIsolation ? this.getPageType(true) : 'default',
      ...options, // 允许调用方覆盖
    }
  }

  /**
   * 获取当前 GreasyFork 页面类型
   * @param groupSimilarTypes 是否将相似页面类型分组
   */
  protected getPageType(groupSimilarTypes: boolean = false): PageType {
    const pageType = PageHandler.getCurrentPageType()

    if (!groupSimilarTypes)
      return pageType

    // 获取当前平台的转换规则
    const platformRules = HOSTNAME in this.defaultTypeMap
      ? this.defaultTypeMap[HOSTNAME]
      : undefined

    // 返回转换后的类型（若无匹配则返回原类型）
    return (platformRules as Record<PageType, PageType>)?.[pageType] ?? pageType
  }
}
